import os

import pandas as pd
from django.http import JsonResponse
from openpyxl.reader.excel import load_workbook
from openpyxl.utils import get_column_letter
from rest_framework import status


def download_file_to_excel(request):
    try:
        frame = pd.DataFrame(request)
        file_path = 'D:/teacher_download.xlsx'

        if os.path.exists(file_path):
            print("文件已存在，将被覆盖。")

            # 写入Excel文件
        frame.to_excel(file_path, index=False, engine='openpyxl')

        # 加载工作簿并调整列宽
        workbook = load_workbook(file_path)
        worksheet = workbook.active

        # 遍历第一行（表头）并根据内容设置列宽
        for col_idx, header in enumerate(frame.columns, 1):
            # 获取第一行中对应列的单元格
            cell = worksheet.cell(row=1, column=col_idx)

            # 如果单元格有值（表头通常都有值），则基于内容的长度设置列宽
            if cell.value is not None:
                # 考虑到数字、日期等可能需要额外的空间，可以设置一个缩放因子
                # 这里使用了一个简单的缩放因子1.1，你可以根据需要调整
                max_length = len(str(cell.value)) * 1.1

                # 列宽的最小值可以设置为一个合适的值，比如10（这相当于大约400像素的宽度）
                adjusted_width = max(max_length, 10)

                # 设置列宽（单位是字符宽度的1/256）
                # 注意：openpyxl的列宽是以字符宽度的1/256为单位的，不是像素
                worksheet.column_dimensions[get_column_letter(col_idx)].width = adjusted_width

                # 保存工作簿
        workbook.save(file_path)

        return JsonResponse({"message": "Excel文件已生成或已更新。", "file_path": file_path},
                            status=status.HTTP_200_OK)

    except PermissionError as e:
        # 处理权限错误
        return JsonResponse({"message": "无法写入文件：权限被拒绝,请检查下载文件是否已被打开。", "error": str(e)},
                            status=status.HTTP_403_FORBIDDEN)
    except Exception as e:
        # 处理其他异常
        return JsonResponse({"message": "发生未知错误。", "error": str(e)},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)